package cn.tedu.epidemic.webapi.controller;

import cn.tedu.community.commons.pojo.notice.vo.UserNoticeListItemVO;
import cn.tedu.community.commons.pojo.user.dto.*;
import cn.tedu.community.commons.pojo.user.vo.UserCurrentVO;
import cn.tedu.community.commons.restful.JsonPage;
import cn.tedu.community.commons.restful.JsonResult;
import cn.tedu.epidemic.service.UserService;
import cn.tedu.epidemic.webapi.security.LoginPrincipal;
import com.google.common.net.HttpHeaders;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

/**
 * 用户Controller
 */
@Api(tags = "用户控制器")
@Slf4j
@RestController
@Validated
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService service;

    /**
     * 用户注册
     */
    @PostMapping("/reg")
    public JsonResult<Void> reg(@Valid UserRegDTO urd) {
        log.debug("注册请求参数：{}", urd);
        service.reg(urd);
        return JsonResult.ok();
    }

    /**
     * 用户登录
     */
    @PostMapping("/login")
    public JsonResult<String> login(UserLoginDTO uld, HttpServletResponse response) {
        log.debug("用户登录请求参数：{}", uld);
        String jwt = service.login(uld);
        /*if (jwt!= null && uld.getUserRem()){
            Cookie c1 = new Cookie("userName", uld.getUserName());
            Cookie c2 = new Cookie("userPassword", uld.getUserPassword());
            c1.setMaxAge(60*60*24*30);
            c2.setMaxAge(60*60*24*30);
            response.addCookie(c1);
            response.addCookie(c2);
            log.debug("存放cookie成功！");
        }*/
        return JsonResult.ok(jwt);
    }

    /**
     * 获取当前用户信息
     */
    @ApiOperation("获取当前用户信息")
    @GetMapping("/currentUser")
    public JsonResult<UserCurrentVO> currentUser(@ApiIgnore @AuthenticationPrincipal LoginPrincipal principal) {
        //使用seurity查看一下当前用户
        log.debug("当事人：{}", principal);
        log.debug("当事人的ID：{}", principal.getId());
        log.debug("当事人的用户名：{}", principal.getUsername());
        UserCurrentVO userCurrentVO = service.currentUser();
        log.debug("控制层获取完当前用户信息：{}",userCurrentVO);
        return JsonResult.ok(userCurrentVO);
    }

    @ApiOperation("用户退出登录")
    @PostMapping("/logout")
    public JsonResult<Void> logout() {
        log.debug("开始处理【用户退出登录】的请求，无参数");
        SecurityContextHolder.clearContext();
        log.debug("退出登录成功！");
        return JsonResult.ok();
    }

    @PostMapping("/update")
    public JsonResult<Void> update(@Valid UserUpdateDTO userUpdateDTO) {
        log.debug("控制层即将开始处理【用户信息修改】的业务，参数：{}", userUpdateDTO);
        service.update(userUpdateDTO);
        return JsonResult.ok();
    }

    @PostMapping("/updatePass")
    public JsonResult<Void> updatePass(@Valid UserUpdatePassDTO updatePassDTO) {
        log.debug("控制层即将开始处理【修改密码】的业务，参数：{}", updatePassDTO);
        service.updatePassById(updatePassDTO);
        return JsonResult.ok();
    }

    @ApiOperation("通过手机号统计数量")
    @GetMapping("/countPhone/{userPhone:[0-9]+}")
    public JsonResult<Void> countByPhone(@NotNull(message = "请输入您的手机号")
                                         @Pattern(regexp = "^1[3-9]\\d{9}$",
                                                 message = "手机号码格式不正确,请重新输入!")
                                                    @PathVariable String userPhone){
        log.debug("开始执行通过手机号统计数量，手机号是：{}",userPhone);
        service.countByPhone(userPhone);
        return JsonResult.ok();
    }

    @ApiOperation("通过手机号修改密码")
    @PostMapping("/forgotPass")
    public JsonResult<Void> updatePassByPhone(@Valid UserForGotPassDTO forGotPassDTO){
        log.debug("开始执行通过手机号修改密码，数据是：{}",forGotPassDTO);
        service.updatePassByPhone(forGotPassDTO);
        return JsonResult.ok();
    }
}
